package com.jsaas.core.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.template.Engine;
import com.jsaas.common.Constant;
import com.jsaas.core.cache.MyCache;
import com.jsaas.core.handler.SessionIdHandler;
import com.jsaas.core.security.ShiroMethod;
import com.jsaas.interceptor.AuthorityInterceptor;
import com.jsaas.interceptor.ExceptionInterceptor;
import com.jsaas.interceptor.ShiroInterceptor;
import com.jsaas.model._MappingKit;
import com.jsaas.web.route.SysRoutes;

import net.dreamlu.event.EventPlugin;

/**   
 * @Title: BaseConfig.java 
 * @Package com.jsaas.core.config 
 * @Description: TODO API配置
 * @author tuozq 
 * @date 2017年10月26 下午2:21:22 
 * @version V1.0   
 */
public class BaseConfig extends JFinalConfig {


	/**
	 * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 * 
	 * 使用本方法启动过第一次以后，会在开发工具的 debug、run config 中自动生成
	 * 一条启动配置，可对该自动生成的配置再添加额外的配置项，例如 VM argument 可配置为：
	 * -XX:PermSize=64M -XX:MaxPermSize=256M
	 */
	public static void main(String[] args) {
		/**
		 * 特别注意：Eclipse 之下建议的启动方式
		 */
		JFinal.start("src/main/webapp", 80, "/", 5);
	}

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use(Constant.APPLICATION_FILE_NAME);
		//me.setViewType(ViewType.JFINAL_TEMPLATE);
		me.setDevMode(PropKit.getBoolean("devMode", true));
		me.setErrorView(403, "/login.html");
		me.setErrorView(500, "/views/error/500.html");
	}

	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add(new SysRoutes());
	}
	
	
	public void configEngine(Engine me) {
		me.setDevMode(PropKit.getBoolean("devMode", true));
		me.addSharedFunction("/common/_common.html");

		me.addSharedMethod(StrKit.class);
		me.addSharedObject("shiro", new ShiroMethod());

		me.addSharedObject("ctx","");
	}

	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置 druid 数据库连接池插件
		DruidPlugin druidPlugin = createDruidPlugin();
		me.add(druidPlugin);

		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		// 所有映射在 MappingKit 中自动化搞定
		_MappingKit.mapping(arp);

		arp.setCache(new MyCache());

		//配置模块化sql
		arp.setBaseSqlTemplatePath(PathKit.getRootClassPath() + "/sqltemplate");
		arp.addSqlTemplate("all.sql");
		//统一数据库字段为小写
		arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
		arp.setDialect(new MysqlDialect());
		arp.setShowSql(true);
		me.add(arp);

		/*配置定时任务*/  
		Cron4jPlugin cron = new Cron4jPlugin(Constant.CRON4J_FILE_NAME);  
		me.add(cron); 

		//配置event
		EventPlugin plugin = new EventPlugin();
		// 设置为异步，默认同步，或者使用`threadPool(ExecutorService executorService)`自定义线程池。
		plugin.async();

		// 设置扫描jar包，默认不扫描
		plugin.scanJar();
		// 设置监听器默认包，默认全扫描
		//plugin.scanPackage("net.dreamlu");
		//配置缓存
		me.add(new RedisPlugin(Constant.COMMON_CACHE, PropKit.get("redis.ip"), PropKit.getInt("redis.port")));

		me.add(new RedisPlugin(Constant.REDIS_SHIROMANAGE_CACHE, PropKit.get("redis.ip"), PropKit.getInt("redis.port")));
		
	}

	public static DruidPlugin createDruidPlugin() {
		DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("db.jdbcUrl"), PropKit.get("db.user"), PropKit.get("db.password").trim());
		druidPlugin.setPublicKey(PropKit.get("db.publicKey"));
		druidPlugin.setFilters(PropKit.get("db.filters"));
		return druidPlugin;
	}

	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		//异常拦截器
		me.add(new ExceptionInterceptor());
		me.add(new AuthorityInterceptor());
		//shiro 拦截器  
		//扫描注解 RequiresPermissions.class, RequiresRoles.class, RequiresUser.class,RequiresGuest.class, RequiresAuthentication.class
		//me.add(new ShiroInterceptor());
	}

	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		me.add(new SessionIdHandler());
		me.add(new DruidStatViewHandler("/druid"));
	}

	@Override
	public void afterJFinalStart() {
		// TODO Auto-generated method stub
		super.afterJFinalStart();
	}
}
